package ChiselStudy

import chisel3._


///////////////////////////  方法一  ////////////////////////////


class MyManyDynamicElementVecFir(length: Int) extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val out = Output(UInt(8.W))
    val consts = Input(Vec(length, UInt(8.W)))
  })

  // Reference solution
  val regs = RegInit(VecInit(Seq.fill(length - 1)(0.U(8.W))))
  for(i <- 0 until length - 1) {
    if(i == 0) regs(i) := io.in
    else       regs(i) := regs(i - 1)
  }


  val muls = Wire(Vec(length, UInt(8.W)))
  for(i <- 0 until length) {
    if(i == 0) muls(i) := io.in * io.consts(i)
    else       muls(i) := regs(i - 1) * io.consts(i)
  }

  val scan = Wire(Vec(length, UInt(8.W)))
  for(i <- 0 until length) {
    if(i == 0) scan(i) := muls(i)
    else scan(i) := muls(i) + scan(i - 1)
  }

  io.out := scan(length - 1)
}


///////////////////////////  方法二  ////////////////////////////

//
//class Adder extends Module {
//  val io = IO(new Bundle {
//    val a = Input(UInt(8.W))
//    val b = Input(UInt(8.W))
//    val y = Output(UInt(8.W))
//  })
//
//  io.y := io.a + io.b
//}
//
//class Register extends Module {
//  val io = IO(new Bundle {
//    val d = Input(UInt(8.W))
//    val q = Output(UInt(8.W))
//  })
//
//  val reg = RegInit(0.U)
//  io.q := reg
//  reg := io.d
//}
//
//class Count10 extends Module {
//  val io = IO(new Bundle {
//    val dout = Output(UInt(8.W))
//  })
//
//  // 利用写好的两个模块
//  val add = Module(new Adder())
//  val reg = Module(new Register())
//
//  // 寄存器存放的为当前的计数
//  val count = reg.io.q
//
//  // 当前计数和1.U作为加法器的输入
//  add.io.a := 1.U
//  add.io.b := count
//  val result = add.io.y
//
//  // 如果累加达到了10.U，则计数器清零
//  val next = Mux(result === 10.U, 0.U, result)
//  reg.io.d := next
//
//  io.dout := count
//}



object MyManyDynamicElementVecFir_Gen extends App {
  println("Generating the adder hardware")
  (new chisel3.stage.ChiselStage).emitVerilog(new MyManyDynamicElementVecFir(4),Array("--target-dir", "generated/ChiselStudy/ElementVec"))
}
